﻿// Nova.Studio - a GUI test framework for the Nova.CodeDOM C# object model library.
// Copyright (C) 2007-2012 Inevitable Software, all rights reserved.
// Released under the Common Development and Distribution License, CDDL-1.0: http://opensource.org/licenses/cddl1.php

using System.Reflection;
using System.Windows;
using Attribute = System.Attribute;

using Nova.CodeDOM;

namespace Nova.Studio
{
    /// <summary>
    /// Interaction logic for AboutWindow.xaml
    /// </summary>
    public partial class AboutWindow : Window
    {
        public AboutWindow()
        {
            InitializeComponent();

            // Populate the About window
            Title = string.Format("About {0}", AssemblyTitle);
            labelProduct.Content = DisplayProductAndVersion(AssemblyProduct, AssemblyVersion);
            labelLibrary.Content = DisplayProductAndVersion(NovaCoreAssemblyProduct, NovaCoreAssemblyVersion);
            labelCopyright.Content = AssemblyCopyright;
            textBoxDescription.Text = AssemblyDescription + "\n" + NovaCoreAssemblyDescription;
        }

        private static string DisplayProductAndVersion(string product, string version)
        {
            string[] parts = version.Split('.');
            string majorVersion = parts[0] + '.' + parts[1];
            string buildNumber = parts[2] + '.' + parts[3];
            return product + " " + majorVersion + "  (build " + buildNumber + ")";
        }

        #region Assembly Attribute Accessors

        private static string AssemblyTitle
        {
            get { return GetAssemblyCustomAttribute<AssemblyTitleAttribute>().Title; }
        }

        private static string AssemblyVersion
        {
            get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
        }

        private static string AssemblyDescription
        {
            get { return GetAssemblyCustomAttribute<AssemblyDescriptionAttribute>().Description; }
        }

        private static string AssemblyProduct
        {
            get { return GetAssemblyCustomAttribute<AssemblyProductAttribute>().Product; }
        }

        private static string AssemblyCopyright
        {
            get { return GetAssemblyCustomAttribute<AssemblyCopyrightAttribute>().Copyright; }
        }

        private static T GetAssemblyCustomAttribute<T>() where T : Attribute
        {
            object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(T), false);
            return (attributes.Length > 0 ? (T)attributes[0] : null);
        }

        private static string NovaCoreAssemblyVersion
        {
            get { return Assembly.GetAssembly(typeof(CodeObject)).GetName().Version.ToString(); }
        }

        private static string NovaCoreAssemblyProduct
        {
            get { return GetNovaCoreCustomAttribute<AssemblyProductAttribute>().Product; }
        }

        private static string NovaCoreAssemblyDescription
        {
            get { return GetNovaCoreCustomAttribute<AssemblyDescriptionAttribute>().Description; }
        }

        private static T GetNovaCoreCustomAttribute<T>() where T : Attribute
        {
            object[] attributes = Assembly.GetAssembly(typeof(CodeObject)).GetCustomAttributes(typeof(T), false);
            return (attributes.Length > 0 ? (T)attributes[0] : null);
        }

        #endregion

        private void buttonOK_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
        }
    }
}
